package com.ruoyi.web.core.netty;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import io.netty.handler.codec.TooLongFrameException;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;

/**
 * 功能描述: 自定义接收消息格式
 *
 * @Author keLe
 * @Date 2022/8/26
 */
public class MyDecoder extends ByteToMessageDecoder {

    private static final int BASE_LENGTH = 20;


    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> returnList) throws Exception {
//        System.out.println(byteBuf.toString());
//        Message Message = new Message();
//        int readableLength = byteBuf.readableBytes();
//        byte[] dst = null;
//        if (readableLength < BASE_LENGTH) {//数据不够，解码不了
//            System.out.println("本次解码失败;参与解码的数据长度共" + readableLength + "字节");
//            return;
//        }
//        //防止socket字节流攻击、客户端传来的数据过大，这里需要对数据进行过滤掉
//        if (readableLength >= 4096) {
//            byteBuf.skipBytes(byteBuf.readableBytes());
//            throw new TooLongFrameException("客户端传来的数据过大,超出阈值，对数据进行过滤" + readableLength + "个字节");
//        }
//        // 判断 ByteBuf 可读取字节
//        if (readableLength > BASE_LENGTH) {
//            dst = new byte[byteBuf.readableBytes()];
//            byteBuf.readBytes(dst);
//            Message.setMsgBody(HexDecoder.bytesToHexString(dst));
//            Message.setHeader(HexDecoder.bytesToHexString(dst[0]));
//            //获取数据包的数量
//            byte[] countBytes = new byte[]{dst[6], dst[7]};
//            //获取设备事务标记 2字节
//            Message.setTransactionId(new byte[]{dst[PacketEnum.PACKET_INDEX_ZERO.getCode()],
//                    dst[PacketEnum.PACKET_INDEX_FIRST.getCode()]});
//            Message.setPacketNumber(Integer.parseInt(BytesUtil.byteArr2HexStr(countBytes)));
//            List<InsideMessage> list = new ArrayList<InsideMessage>();
//            for (int i = 0; i < Message.getPacketNumber(); i++) {
//                // * 8 换位运算提高效率
//                int from = (i + 1) << 3;
//                int to = (i + 2) << 3;
//                // 创建（to-from）的长度字节
//                byte[] bytes = Arrays.copyOfRange(dst, from, to);
//                InsideMessage insideMessage = new InsideMessage();
//                //获取时间戳
//                byte[] timeBytes = new byte[]{bytes[0], bytes[1], bytes[2], bytes[3]};
//                //服务器时间戳-设备的这个时间戳–IC卡的时间戳
//                insideMessage.setDeviceTimestamp(Long.parseLong(BytesUtil.byteArr2HexStr(timeBytes), PacketEnum.PACKET_HEX.getCode()));
//                LocalDateTime ldt = DateUtils.getDateTime(BytesUtil.HexString4ByteUnixToDate(insideMessage.getDeviceTimestamp(), DateUtils.DEFAULT_FORMAT_STR));
//                insideMessage.setSwipeCardDate(ldt);
//                System.out.println("SwipeCardDate(:" + insideMessage.getSwipeCardDate());
//                //获取卡号
//                byte[] equIdBytes = new byte[]{bytes[4], bytes[5], bytes[6], bytes[7]};
//                insideMessage.setCardNum(BytesUtil.byte2Int(equIdBytes));
//                list.add(insideMessage);
//            }
//            Message.setInsideMessagePacks(list);
//            returnList.add(Message);
//        } else {
//            // 不是8个时候的处理，一个ic卡号时
//            dst = new byte[20];
//            byteBuf.readBytes(dst);//读取所有的数据
//            byteBuf.resetReaderIndex();//重置索引下标
//            Message Message1 = new Message();
//            Message1.setBody(dst);
//            //获取设备事务标记x 2字节
//            short i = byteBuf.readShort();
//            Message1.setTransactionId(BytesUtil.short2ByteNew(i));
//            //获取时间戳 4字节
//            byte[] timeBytes2 = BytesUtil.IntToByte(byteBuf.readInt());
//            String timeStr2 = BytesUtil.byteArr2HexStr(timeBytes2);
//            Message1.setDeviceTimestamp(Long.parseLong(timeStr2, PacketEnum.PACKET_HEX.getCode()));
//            String dateStr2 = BytesUtil.HexString4ByteUnixToDate(Message1.getDeviceTimestamp(),
//                    DateUtils.DEFAULT_FORMAT_STR);
//            LocalDateTime ldt2 = DateUtils.getDateTime(dateStr2);
//            Message1.setSwipeCardDate(ldt2);
//            byteBuf.skipBytes(6);//跳过6个字节 获取卡号信息
//            //获取卡号
//            Message1.setCardNum(byteBuf.readInt());
//            Message.setBodyHexStr(BytesUtil.byteArr2HexStr(dst));
//            byteBuf.readInt();//读完最后4个字节 不让之后查询数据取位错误
//            returnList.add(Message1);
//        }
    }
}
